package com.sicnu.carrent.controller;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.sicnu.carrent.domain.Cars;
import com.sicnu.carrent.domain.Type;
import com.sicnu.carrent.domain.Users;
import com.sicnu.carrent.json.MyResponse;
import com.sicnu.carrent.serivce.CarsService;
import com.sicnu.carrent.serivce.TypeService;
import com.sicnu.carrent.serivce.UsersService;
import java.util.List;

import com.sicnu.carrent.view.Menu;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.time.LocalDate;

@Controller
@RequestMapping("users")
public class UsersController {

    @Resource
    private UsersService usersService;

    @Resource
    private TypeService typeService;

    @Resource
    private CarsService carsService;

    //跳转到用户登录界面
    @RequestMapping("toLogin")
    public String toLogin(){

        return "login";
    }

    //跳转到用户查询车型的页面
    @RequestMapping("toSearch")
    public String toSearch(@RequestParam (name="type",required = false,defaultValue = "轿车") String type, @RequestParam (name="brand",required = false ,defaultValue = "上汽大众") String brand, Model model){

        //暂时只考虑按照车型进行查询。
        //初始化一个菜单的视图，对应视图类Menu,初始化里面的typeMap属性。
        //获得类型的集合
        List<Type> typeList = typeService.findAllTypes();
        Menu menu = new Menu();

        //初始化菜单对象。
        for(Type t:typeList){
          List<String> brandsList =  carsService.findBrandsByTypeName(t.getName());
          menu.getTypeMap().put(t.getName(),brandsList);
        }

        List<Cars> carsList = carsService.findAllByTypeAndBrand(type,brand);

        model.addAttribute("menu",menu);
        model.addAttribute("carsList",carsList);
        model.addAttribute("typeName",type);
        model.addAttribute("brandName",brand);

        return "search";
    }


    //执行用户登陆的方法
    @RequestMapping("login")
    @ResponseBody
    public MyResponse login(String param, HttpSession session){
        //System.out.println("登录动作接收到的jason字符串："+param);
        //return "ok"; // templates/ok.html , 我的本意想返回一个字符串 "ok"
        //jason字符串，要求有特殊的返回格式的， 'ok'不是一个合法的jason格式的字符串。
        MyResponse resp = new MyResponse();
        Users user = JSON.parseObject(param, new TypeReference<Users>() {});

        //首先判断用户输入的验证码是否正确。

        String validateCode = user.getValidatecode(); //用户输入的验证码
        String verifyCode = (String) session.getAttribute("vrifyCode");//session中保存的验证码
        System.out.println("你输入的验证码是：" + validateCode);
        System.out.println("session中的验证码是：" + verifyCode);

        if(!validateCode.equals(verifyCode)){
            resp.failure("validateCodeError");
            return resp;
        }


        //把param字符串---》转为一个Users对象。
        //json转对象。
        Users loginUser = usersService.login(user.getUsername(),user.getPassword());
        if(loginUser!=null){
            //把登录成功的用户对象保存到session中。
            session.setAttribute("loginUser",loginUser);
            resp.success();
        }else{
            resp.failure();
        }

        return resp;
    }

    //执行用户注销的方法
    @RequestMapping("logout")
    public String logout(HttpSession session){
        if(session.getAttribute("loginUser")!=null){
            session.removeAttribute("loginUser");
        }
        return "redirect:/users/toLogin"; //请求重定向
    }

    //执行用户注册
    @RequestMapping("reg")
    @ResponseBody
    public MyResponse reg(String param){
        MyResponse resp = new MyResponse();

        //把param字符串---》转为一个Users对象。
        //json转对象。
        Users user = JSON.parseObject(param, new TypeReference<Users>() {});

        LocalDate today = LocalDate.now();
        user.setRegDate(today.toString());
        user.setStatus(1);
        Users regUser = usersService.reg(user);
        if(regUser!=null){
            //把登录成功的用户对象保存到session中。
            //session.setAttribute("loginUser",loginUser);
            resp.success();
        }else{
            resp.failure();
        }

        return resp;

    }

    //检查用户名是否已经被占用的动作
    @RequestMapping("checkUsernameIsExist")
    @ResponseBody
    public MyResponse checkUsernameIsExist(String username){
        MyResponse resp = new MyResponse();
        if(usersService.checkUsernameIsExist(username)){
            //说明该用户名可用。
            System.out.println("用户名可用");
            resp.success();
        }else{
            System.out.println("用户名不可用");
            resp.failure();
        }
        return resp;
    }


}
